<?php
/**
 * @brief  Klasa kontrolera network z modułu "admin"
 * 
 * Zamieszczone w niej akcje umożliwiają zarządzanie siecią dostaw towarów, 
 * wewnątrz której będą rozprowadzane dobra i usługi oferowane na aukcjach.
 */
class Admin_NetworkController extends Zend_Controller_Action
{


    protected $_user = null; /*!< Pole na dane użytkownia uzyskiwane z Zend_Auth */
    
    /**
     * @brief Standardowa metoda, której wykonanie poprzedza działanie akcji.
     * 
     * Przekazywany jest do niej widok nagłówka, pobierane są
     * wiadomości z flashMessengera oraz sprawdzane jest czy
     * użytkownik jest  zalogowany i uprawniony do dostępu do
     * akcji kontrolera.  
     * 
     */
    public function preDispatch()
    {
        $this->view->render('index/_headbox.phtml');
        $this->_flashMessenger = $this->_helper->getHelper('FlashMessenger');
        $this->view->messages = $this->_flashMessenger->getMessages();
        
        
        $auth = Zend_Auth::getInstance();
        if($auth->hasIdentity()){
            $this->_user = $auth->getIdentity();
        } else {
            $this->_helper->flashMessenger->addMessage("warning/Zaloguj się!");
            $this->_helper->redirector('login','auth','default');
        }
        
        $user = $auth->getIdentity();
        if($user->role != 'admin'){
            $this->_helper->flashMessenger->addMessage("warning/Nie masz wymaganych uprawnień!");
            $this->_helper->redirector('index','mymca','default'); 
        }
    }

    /**
     * @brief  Akcja index
     * 
     * Akcja wyświetlająca ekran główny kontrolera.
     * Pojawiają się na nim proste informacje na temat sieci.
     */
    public function indexAction()
    {
        //wyświetlanie nazwy i opisu sieci
        $mapper = new Application_Model_NetworkMapper();
        $network = $mapper->find(1);
        if (!isset($network)){
            $network = new Application_Model_Network();
            $network->setName('Podaj nazwę sieci!');
            $network->setDescription('Opis');
            $mapper->save($network);        
        }
        $this->view->network = $network;
        //proste statystyki
        $arcMapper = new Application_Model_NetworkArcMapper();
        $this->view->arcs = $arcMapper->count();
        $nodeMapper = new Application_Model_NetworkNodeMapper();
        $this->view->nodes = $nodeMapper->count();
        
        
    }
    
    /**
     * @brief  Akcja umożliwiająca zarządzanie lokalizacjami.
     * 
     * Umożliwia dodawanie nowych lokalizacji i wyświetlanie listy istniejących.
     * Po wybraniu lokalizacji z listy następuje wywołanie ekranu połączeń
     * związanych z wybraną lokalizacją.
     */
    public function nodesAction()
    {
        $mapper = new Application_Model_NetworkNodeMapper();
        $form = new Application_Form_AddNode();
        $this->view->form = $form;
        $request = $this->getRequest();
        if(!isset($page)) $page = 1; 
        
        $page = $request->getParam('page');
        //dodawanie nwoej lokalizacji
        if($request->isPost()){
            if($form->isValid($request->getPost())){
                $node = new Application_Model_NetworkNode($form->getValues());
                $node->setNetwork_id(1);
                $mapper->save($node);
                
            }
        }
        

        $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($mapper->fetchAll()));
        $paginator->setCurrentPageNumber($page);
        $paginator->setItemCountPerPage(20);     
        $this->view->nodes = $paginator;
    }

    /**
     * @brief  Akcja umożliwiająca zarządzanie połączeniami
     * 
     * Akcja umożliwia dodawanie nowych połączeń oraz wyświetlenie listy już 
     * istniejących. Wspomniana lista może być ograniczana ze względu na: 
     * - lokalizację wchodzącą w skład połączenia
     * - lokalizację z której połączenie wychodzi
     * - lokalizację na której się kończy 
     * 
     * Tworzone lokalizacje nie mogą się zaczynać i kończyć w tej samej lokalizacji.
     * Lokalizacje są skierowane. Może istnieć wiele połączeń,zaczynających się
     * i kończących w tej samej parze lokalizacji.
     * 
     */
    public function arcsAction()
    {
        // czynności wstepne
        $mapper = new Application_Model_NetworkArcMapper();
        $form = new Application_Form_AddArc();
        $this->view->form = $form;
        $request = $this->getRequest();
        // pobierania parametrów
        $from = $request->getParam('from');
        $to = $request->getParam('to');
        $page = $request->getParam('page');
        $nId = $request->getParam('node');
        
        if(!isset($page)) $page = 1; 
        //tworzenie zapytania
        if(isset($from)){
            $query = 'predecessor = '.$from.' ';
        } else {
            $query = '1';
        }
        
        if(isset($to)) {
                $query .= ' AND successor = '.$to.' ';
        } else {
            $query .= ' AND 1';
        }
        
        $nodeMapper = new Application_Model_NetworkNodeMapper();
        //przekazywanie informacji powiązanych z parametrami akcji do jego widoku
        if(isset($nId)){
            $query =  'predecessor = '.$nId.' or successor = '.$nId.' ';
            $node = $nodeMapper->find($nId);
            if(isset ($node))
            $this->view->node = $node->getName();
        }
        
        if(isset ($from)){
            $node = $nodeMapper->find($from);
            if(isset ($node))
            $this->view->from = $node->getName();
        }
        
        if(isset ($to)){
            $node = $nodeMapper->find($to);
            if(isset ($node))
            $this->view->to = $node->getName();
        }
        
        //dodawanie nowego połączenia
        if($request->isPost()){
            if($form->isValid(($request->getPost()))){
                if($form->getValue('predecessor') != $form->getValue('successor')){
                $arc = new Application_Model_NetworkArc($form->getValues());
                $mapper->save($arc);
                $this->view->messages[] = 'success/Dodano nowe połączenie!';
                } else {
                    $this->view->messages[] = 'error/Połączenie nie może kończyć się w lokalizacji w której się zaczyna!';
                }
            }
        }
        
        $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($mapper->fetchAll($query)));
        $paginator->setCurrentPageNumber($page);
        $paginator->setItemCountPerPage(20);     
        $this->view->arcs = $paginator;;
    }


    /**
     * @brief  Akcja wyświetlająca formularz zmiany nazwy i opisu jedynej sieci dostaw.
     */
    public function changeAction()
    {
        $mapper = new Application_Model_NetworkMapper();
        $network = $mapper->find(1);
        
        $form = new Application_Form_ChangeNetworkDetails();
        $form->populate(array(
           'name'           => $network->getName(),
           'description'    => $network->getDescription(),
        ));
        $this->view->form = $form;
        
        
    }
    
    /**
     * @brief  Akcja przetwarzająca formularz zmiany opisu i nazwy sieci dostaw.
     * 
     * Akcja nie posiada widoku.
     */
    public function processNetworkChangeAction()
    {
        
        $mapper = new Application_Model_NetworkMapper();
        $form = new Application_Form_ChangeNetworkDetails();
        
        if($this->_request->isPost()){
            if($form->isValid($params = $this->getRequest()->getParams())){
                $network = new Application_Model_Network();
                $network->setName($params['name']);
                $network->setDescription($params['description']);
                $network->setNetwork_id(1);
            
                $mapper->save($network);
                
                
            }
        }
        $this->_helper->redirector('index','network','admin');
    }

    /**
     * @brief  Akcja usuwania lokalizacji
     * 
     * Usunięte moga zostać tylko nowe, nieużywane lokalizacje.
     * Akcja nie posiada widoku.
     */
    public function deleteNodeAction()
    {
        $id = $this->getRequest()->getParam('id');
        if(isset ( $id )){
            $arcMapper = new Application_Model_NetworkArcMapper();
            $commodityMapper = new Application_Model_CommodityMapper();
            //sprawdzenie czy lokalizacja jest już wykorzystywana
            if(($arcMapper->count('predecessor = "'.$id.'" or successor = "'.$id.'"') == 0 ) && ($commodityMapper->count('NetworkNode_id = "'.$id.'"') == 0)){
                $mapper = new Application_Model_NetworkNodeMapper();
                $mapper->delete($id);
                $this->_helper->_flashMessenger->addMessage('success/Usunięto lokalizację!');
            } else {
                $this->_helper->_flashMessenger->addMessage('error/Podana lokalizacja jest już używana!');
            }
        } else {
            $this->_helper->_flashMessenger->addMessage('error/Nie wskazano lokalizacji do usunięcia');
        }
        $this->_helper->_redirector('nodes');
    }

    /**
     * @brief Akcja usuwania połączeń
     * 
     * Usunięte mogą zostać tylko nowe, nieużywane połączenia.
     * Akcja nie posiada widoku.
     */
    public function deleteArcAction()
    {
        $id = $this->getRequest()->getParam('id');
        if(isset ( $id )){
            $commodityMapper = new Application_Model_CommodityMapper();
            
            if($commodityMapper->count('NetworkArc_id = "'.$id.'"') == 0 ){
                $mapper = new Application_Model_NetworkArcMapper();
                $mapper->delete($id);
                $this->_helper->_flashMessenger->addMessage('success/Usunięto podane połączenie!');
            } else {
                $this->_helper->_flashMessenger->addMessage('error/Podane połączenie jest już w użyciu!');
            }
        } else {
            $this->_helper->_flashMessenger->addMessage('error/Nie wskazano połączenia do usunięcia!');
        }
        $this->_helper->_redirector('arcs');
    }

    /**
     * @brief Akcja modyfikowania połączenia.
     * 
     * Wyświetlany formularz posiada wstępnie wybrane poprzedni lokalizacje.
     */
    public function editArcAction()
    {
        // czynności wstepne
        $id = $this->getRequest()->getParam('id');
        $request = $this->getRequest();
        $form = new Application_Form_AddArc();
        $this->view->form = $form;
        //uzupełnianie formularza
        if(isset ( $id )){
            $mapper = new Application_Model_NetworkArcMapper();
            $arc = $mapper->find($id);
            $data = array(
            
            'predecessor' => $arc->getPredecessor(),
            'successor' => $arc->getSuccessor(),
            
             );
            $form->populate($data);
            //zmiana istniejącego połączenia (o ile możliwe)
            if($arc != NULL ){
                if($request->isPost()){
                    if($form->isValid($request->getPost())){
                        $arc->setOptions($form->getValues());
                        $mapper->save($arc);
                        $this->_helper->_flashMessenger->addMessage('success/Zmodyfikowano połączenie!');
                        $this->_helper->_redirector('arcs'); 
                    }
                }
            } else {
                $this->_helper->_flashMessenger->addMessage('error/Nie znaleziono połączenia o podanym id!');
                $this->_helper->_redirector('arcs');      
            }
        } else {
            $this->_helper->_flashMessenger->addMessage('error/Nie wskazano połączenia do zmodyfikowania!');
            $this->_helper->_redirector('arcs');
        }
    }

    /**
     * @brief Akcja modyfikowania lokalizacja.
     * 
     * Wyświetlany formularz posiada wstępnie wprowadzoną  wcześniej nazwę lokalizacji.
     */
    public function editNodeAction()
    {
        // czynności wstępne
        $id = $this->getRequest()->getParam('id');
        $request = $this->getRequest();
        $form = new Application_Form_AddNode();
        $this->view->form = $form;
        //uzupełnianie formularza
        if(isset ( $id )){
            $mapper = new Application_Model_NetworkNodeMapper();
            $node = $mapper->find($id);
            $data = array(
            
            'name'          => $node->getName(),
            
             );
            $form->populate($data);
            //zapisywanie zmian
            if($node != NULL ){
                if($request->isPost()){
                    if($form->isValid($request->getPost())){
                        $node->setOptions($form->getValues());
                        $mapper->save($node);
                        $this->_helper->_flashMessenger->addMessage('success/Zmieniono nazwę lokalizacji!');
                        $this->_helper->_redirector('nodes'); 
                    }
                }
            } else {
                $this->_helper->_flashMessenger->addMessage('error/Nie znaleziono lokalizacji o podanym id!');
                $this->_helper->_redirector('nodes');      
            }
        } else {
            $this->_helper->_flashMessenger->addMessage('error/Nie wskazano lokalizacji do zmodyfikowania!');
            $this->_helper->_redirector('nodes');
        }
    }
    
    /**
     * @brief  Metoda wyświetlająca stopkę strony, po zakończeniu akcji.
     */
    public function postDispatch()
    {
        $this->view->render('index/_footbox.phtml');
        
    }
}





